package com.wt.ecommerce.advice;

import com.wt.ecommerce.annoation.IgnoreResponseAdvice;
import com.wt.ecommerce.vo.CommonResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @Auther: wtt
 * @Date: 2022/4/27 00:39
 * @Description:
 */
@RestControllerAdvice("com.wt.ecommerce")
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter,
                            Class<? extends HttpMessageConverter<?>> aClass) {
        boolean result = false;
        if (!methodParameter.getDeclaringClass()
                .isAnnotationPresent(IgnoreResponseAdvice.class)) {
            if (!methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {
                result = true;
            }
        }

        return result;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        Object result;
        // 定义最终的返回对象
        CommonResponse<Object> response = new CommonResponse<>(0, "");

        if (null == o) {
            result = response;
        } else {
            if (o instanceof CommonResponse) {
                response = (CommonResponse<Object>) o;
            } else {
                response.setData(o);
            }
            result = response;
        }

        return result;
    }
}
